﻿using System;
using System.Collections.Generic;
using Black.Surface2DEngine.Graphic2D;

namespace Black.Surface2DEngine.Common.Args
{
    /// <summary>
    /// Arguements pour le call back du timer
    /// </summary>
    public class TimerCallBackArgs: EventArgs
    {
        #region Variables d'instances

        private bool m_bIsAfter;
        private bool m_bIsLoop;
        private bool m_bCancelLoop;
        private float m_fTimeReal;
        private float m_fTimeExpected;
        private Dictionary<string, object> m_oParams;

        #endregion

        #region Constructeurs

        /// <summary>
        /// Constructeur de la classe
        /// </summary>
        /// <param name="p_oItem">Item timer tick de référence</param>
        /// <param name="p_fRealTime">Temps réel de l'exécution du tick</param>
        /// <param name="p_bIsAfter">TURE event raise après l'update, FALSE avant l'update écran</param>
        public TimerCallBackArgs(TimerItem p_oItem, float p_fRealTime, bool p_bIsAfter)
            : base()
        {
            this.m_bIsAfter = p_bIsAfter;
            this.m_bIsLoop = p_oItem.IsLoop;
            this.m_bCancelLoop = false;
            this.m_fTimeReal = p_fRealTime;
            this.m_fTimeExpected = p_oItem.Tick;
            this.m_oParams = p_oItem.Params;
        }

        #endregion

        #region Indexer

        /// <summary>
        /// Affecte ou retourne si on doit annuler le mode boucle
        /// </summary>
        public bool CancelLoop
        {
            get
            {
                return (this.m_bCancelLoop);
            }
            set
            {
                this.m_bCancelLoop = value;
            }
        }

        /// <summary>
        /// Retourne si le raise est après l'update écran
        /// </summary>
        public bool IsAfter
        {
            get
            {
                return (this.m_bIsAfter);
            }
        }

        /// <summary>
        /// Retourne si le timer est en mode loop
        /// </summary>
        public bool IsLoop
        {
            get
            {
                return (this.m_bIsLoop);
            }
        }

        /// <summary>
        /// Retourne les paramètres liés au tick
        /// </summary>
        public Dictionary<string, object> Params
        {
            get
            {
                return (this.m_oParams);
            }
        }

        /// <summary>
        /// Retourne si le tick attendu
        /// </summary>
        public float TickExpected
        {
            get
            {
                return (this.m_fTimeExpected);
            }
        }

        /// <summary>
        /// Retourne si le tick réel
        /// </summary>
        public float TickReal
        {
            get
            {
                return (this.m_fTimeReal);
            }
        }

        #endregion
    }
}
